package medium字符串解码;

import org.testng.annotations.Test;

import java.util.Objects;
import java.util.Stack;


public class Solution {
    public String decodeString(String s) {
        String s1 ="";                    //创建返回的解码
        String chr ;
        int n = s.length();
        String[] chars = new String[n];    //将s 分解到字符串数组中
        chars = s.split("");
        Stack<String> stack = new Stack();      //创建 借用栈
        for (int i = 0; i < n; i++) {           //遍历每一个元素
            if ("]".equals(chars[i]) ) {        //如果是] 表示 栈中又满足需要解码的元素
                String s2 ="";
                while (!"[".equals(stack.peek())) {     //弹出所有 该括号中的元素
                    chr = stack.pop();
                    s2 = chr + s2;
                }
                stack.pop();                            //删除 栈中的 [ 元素
                chr = stack.peek();                     //检查该括号前的数组
                String num = "";                        //创建一个String 来记录数字的大小
                //Character.isDigit(chr.charAt(0))      判断该个栈顶的元素是不是数字
                //如果为空不进行循环
                while(Character.isDigit(chr.charAt(0)) && !stack.isEmpty()){     //遍历前面连续的所有数字
                    num = chr+num;                      //记录数字大小和长度
                    stack.pop();                        //取出栈顶元素
                    if (!stack.isEmpty()){              //如果为空 就不能再取出
                        chr = stack.peek();
                    }
                }
                //判断num中是否有数字
                if (Character.isDigit(num.charAt(0))){
                    String s3 = s2;       //记录需要重复的字符串
                    //进行循环
                    for (int j = 0; j < Integer.parseInt(num)-1; j++) {
                        s2 += s3;
                    }
                }
                //将该字符串 压入栈中
                stack.push(s2);
            }
            else          //如果不为] 继续压入栈中
                stack.push(chars[i]);
        }
        String s4 = "";
        //取出所有栈中元素拼接成 解码
        while(!stack.isEmpty())
            s4 = stack.pop()+s4;
        s1 += s4;
        return s1;      //返回解码
    }

    @Test
    public void test(){
        System.out.println(decodeString("20[abc]"));
    }
}
